#include <iostream>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
///////////////////////////////////////////////////////////////
// 系统调用向目标进程发送信号

// kill调用
// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         std::cout << "需要输入：pid 和 signo" << std::endl;
//         exit(0);
//     }
//     // ./mykill pid signo
//     pid_t pid = atoi(argv[1]);
//     int signo = atoi(argv[2]);

//     int n = kill(pid, signo);
//     if(n != 0)
//     {
//         perror("kill");
//     }
//     return 0;
// }

// // raise调用
// int main()
// {
//     int cnt = 0;
//     while (true)
//     {
//         std::cout << "hello lcl " << cnt++ << std::endl;

//         if (cnt == 5)
//         {
//             int n = raise(2);
//             if (n != 0)
//                 perror("raise");
//         }
//         sleep(1);
//     }

//     return 0;
// }

// abort调用
// int main()
// {
//     int cnt = 0;
//     while (true)
//     {
//         std::cout << "hello lcl " << cnt++ << std::endl;
//         if (cnt == 5)
//         {
//             abort();  //kill(getpid(), 6)
//         }
//         sleep(1);
//     }
//     return 0;
// }

//////////////////////////////////////////////////////////////////
// 硬件异常产生信号
// void handler(int signo)
// {
//     std::cout << "捕获信号：" << signo << std::endl;
// }
// int main()
// {
//     signal(SIGFPE, handler);
//     while (1)
//     {
//         std::cout << "我是一个进程" << std::endl;
//         int n = 10;
//         n /= 0;
//     }
//     return 0;
// }

#include<unistd.h>
#include <cstring>
#include <cassert>

/////////////////////////////////////////////////////////////////////////////
//软件条件触发信号发送
//1. 管道中，读取端退出，写入端一直写会引起软件条件，使得给对应进程发SIGPIPE(13)信号，终止进程。
// void handler(int signo)
// {
//     std::cout << "捕获信号：" << signo << std::endl; 
// }
// int main()
// {
//     signal(SIGPIPE, handler);

//     int fds[2];
//     int n = pipe(fds);
//     assert(n == 0);

//     pid_t id = fork();
//     if(id == 0)
//     {
//         close(fds[1]);
//         int cnt = 5;
//         while(1)
//         {
//             char buffer[1024];
//             int n = read(fds[0], buffer, sizeof(buffer)-1);
//             buffer[n] = 0;
//             std::cout << buffer << std::endl;
//             cnt--;
//             if(cnt == 0)
//                 break;
//         }
//         close(fds[0]);
//         exit(0);
//     }
//     close(fds[0]);
//     int cnt = 0;
//     while(1)
//     {
//         char buffer[1024];
//         snprintf(buffer, sizeof buffer, "我是父进程，我在向你发消息 -> %d", cnt++);
//         write(fds[1], buffer, strlen(buffer));
//         sleep(1);
//     }

//     close(fds[1]);

//     return 0;
// }


int main()
{
    alarm(5);
    sleep(2);
    int n = alarm(0);
    std::cout << n << std::endl;
    return 0;
}